package com.practise.rocketmqdemo.listen;

import com.practise.rocketmqdemo.constant.MQConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

/**
 ** topic需要和生产者的topic一致，consumerGroup属性是必须指定的，内容可以随意
 ** selectorExpression的意思指的就是tag，默认为“*”，不设置的话会监听所有消息
 * 问题1:同一topic使用tag区分?
 * 需要使用不同的订阅组,设置不同consumerGroup,若使用一样的订阅组会导致消息吞没
 * 这种现象的原因是：消息的分配是Broker决定的，而不是Consumer端，Consumer端发心跳给Broker，Broker收到后存到consumerTable里（就是个Map），
 * key是GroupName，value是ConsumerGroupInfo。ConsumerGroupInfo里面是包含topic等信息的，但是问题就出在上一步骤，
 * key是groupName，同GroupName的话Broker心跳最后收到的Consumer会覆盖前者的
 */
@Slf4j
@Component
@RocketMQMessageListener(consumerGroup = "cgroup2", topic = MQConstant.TOPIC_TWO ,selectorExpression = "tagA")
public class TopicTwoWithTagReceiver implements RocketMQListener {

    @Override
    public void onMessage(Object msg) {
        log.info("监听:cgroup2 TOPIC_ONE tagA msg:{}" ,msg);
    }
}
